package com.tp2.dao;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import com.tp2.bo.Oferta;
import com.tp2.bo.impl.OfertaMarcaCategoria;
import com.tp2.bo.impl.OfertaProducto;
import com.tp2.bo.impl.OfertaTotal;
import com.tp2.dominio.MedioDePago;
import com.tp2.dominio.Producto;

public class ParserOfertas extends Parser {

 private Collection<Oferta> ofertas;

 private OfertaTotal ofertaTotalTmp;
 private OfertaProducto ofertaProductoTmp;
 private OfertaMarcaCategoria ofertaMarcaCategoriaTmp;
 private SimpleDateFormat formatoFecha = new SimpleDateFormat("dd-MM-yyyy");
 private Oferta ofertaActual;
 private String tipoDeOfertaActual;
 
 public ParserOfertas(){
  
  super ("src/main/resources/ofertasXML.xml");
  ofertas = new ArrayList<Oferta>();
  parseDocument();
 }
 
 public ParserOfertas(String nombreXML){
  
  super ("src/main/resources/"+nombreXML);
  ofertas = new ArrayList<Oferta>();
  parseDocument();
 }
 
 public Collection<Oferta> getOfertas() {
  return ofertas;
 }

 @Override
 public void startElement(String s, String s1, String elementName, Attributes attributes)
   throws SAXException {

  if (elementName.equalsIgnoreCase("OfertaTotal")) {
   ofertaTotalTmp = new OfertaTotal();
   
   ofertaTotalTmp.setMedioDePago(new MedioDePago(attributes.getValue("medioDePago")));
   int porcentaje = Integer.parseInt((attributes.getValue("porcentaje")));
   ofertaTotalTmp.setPorcentaje(porcentaje);
   parsearVigencias(ofertaTotalTmp,attributes);
   
   ofertaTotalTmp.setDescripcion(attributes.getValue("descripcion"));
   
   ofertaActual = ofertaTotalTmp;

  }

  if (elementName.equalsIgnoreCase("OfertaProducto")) {
   
   ofertaProductoTmp = new OfertaProducto();
   parsearVigencias(ofertaProductoTmp,attributes);
   ofertaProductoTmp.setDescripcion(attributes.getValue("descripcion"));
   tipoDeOfertaActual = "Producto";
   ofertaActual = ofertaProductoTmp;
  }
  
  if (elementName.equalsIgnoreCase("OfertaMarcaCategoria")) {
   
   ofertaMarcaCategoriaTmp = new OfertaMarcaCategoria();
   parsearVigencias(ofertaMarcaCategoriaTmp,attributes);
   ofertaMarcaCategoriaTmp.setDescripcion(attributes.getValue("descripcion"));
   tipoDeOfertaActual = "MarcaCategoria";
   ofertaActual = ofertaMarcaCategoriaTmp;
   
  }
  
  if (elementName.equalsIgnoreCase("ProductoAdherido")) {

   double porcentaje = Double.parseDouble((attributes.getValue("porcentaje")));

   Producto productoAdherido = parsearElementoProducto(attributes);
   
   if( tipoDeOfertaActual == "Producto"){
    ofertaProductoTmp.getProductosAdheridos().put(productoAdherido, porcentaje);
   }else
    ofertaMarcaCategoriaTmp.getProductosAdheridos().put(productoAdherido, porcentaje);

  }

  if (elementName.equalsIgnoreCase("ProductoExcluido")) {

   Producto productoExcluido = parsearElementoProducto(attributes);

   if( tipoDeOfertaActual == "Producto"){
    ofertaProductoTmp.getProductosExcluidos().add(productoExcluido);
   }else
    ofertaMarcaCategoriaTmp.getProductosExcluidos().add(productoExcluido);

  }
  
 }

 @Override
 public void endElement(String s, String s1, String element) throws SAXException {

  if (element.equalsIgnoreCase("OfertaTotal")) {
   ofertas.add(ofertaTotalTmp);
  }

  if (element.equalsIgnoreCase("OfertaProducto")) {
   ofertas.add(ofertaProductoTmp);
  }
  
  if (element.equalsIgnoreCase("OfertaMarcaCategoria")) {
   ofertas.add(ofertaMarcaCategoriaTmp);
  }
  
  if (element.equalsIgnoreCase("DiaOferta")) {
   
   DiasDeLaSemana dia = DiasDeLaSemana.valueOf(tmpValue.toUpperCase());

   ofertaActual.getDiasQueAplica().add(dia.ordinal()+1);
  }
  
 }
 
 private Producto parsearElementoProducto(Attributes attributes) {

  String nombre = attributes.getValue("nombre");
  String categoria = attributes.getValue("categoria");
  String marca = attributes.getValue("marca");
  double precio = 0;

  return new Producto(nombre, marca, precio, categoria);

 }
 
 private void parsearVigencias(Oferta oferta, Attributes attributes){
  
  try {
   Date vigenciaDesde = formatoFecha.parse(attributes.getValue("vigenciaDesde"));
   Date vigenciaHasta = formatoFecha.parse(attributes.getValue("vigenciaHasta"));
   
   oferta.setVigenciaDesde(vigenciaDesde);
   oferta.setVigenciaHasta(vigenciaHasta);
   
  } catch (ParseException e) {

   e.printStackTrace();
  }
 }
 
}